Take-home Exercise 2: Spatio-temporal Analysis of COVID-19 Vaccination Trends at the Sub-district Level, DKI Jakarta

Author

Valencia

Published

February 13, 2023

Modified

February 21, 2023

1 Setting the Scene

Since late December 2019, an outbreak of a novel coronavirus disease (COVID-19; previously known as 2019-nCoV) was reported in Wuhan, China, which had subsequently affected 210 countries worldwide. In general, COVID-19 is an acute resolved disease but it can also be deadly, with a 2% case fatality rate.

The COVID-19 vaccination in Indonesia is an ongoing mass immunisation in response to the COVID-19 pandemic in Indonesia. On 13 January 2021, the program commenced when President Joko Widodo was vaccinated at the presidential palace. In terms of total doses given, Indonesia ranks third in Asia and fifth in the world.

According to wikipedia, as of 5 February 2023 at 18:00 WIB (UTC+7), 204,266,655 people had received the first dose of the vaccine and 175,131,893 people had been fully vaccinated; 69,597,474 of them had been inoculated with the booster or the third dose, while 1,585,164 had received the fourth dose. Jakarta has the highest percentage of population fully vaccinated with 103.46%, followed by Bali and Special Region of Yogyakarta with 85.45% and 83.02% respectively.

Despite its compactness, the cumulative vaccination rate are not evenly distributed within DKI Jakarta. The question is where are the sub-districts with relatively higher number of vaccination rate and how they changed over time.

2 Objectives

Exploratory Spatial Data Analysis (ESDA) hold tremendous potential to address complex problems facing society. In this study, you are tasked to apply appropriate Local Indicators of Spatial Association (LISA) and Emerging Hot Spot Analysis (EHSA) to undercover the spatio-temporal trends of COVID-19 vaccination in DKI Jakarta.

3 The Data

3.1 Aspatial Data

For the purpose of this assignment, data from Riwayat File Vaksinasi DKI Jakarta will be used. Daily vaccination data are provides. You are only required to download either the first day of the month or last day of the month of the study period.

3.2 Geospatial Data

For the purpose of this study, DKI Jakarta administration boundary 2019 will be used. The data set can be downloaded at Indonesia Geospatial portal, specifically at this page.

Note
  • The national Projected Coordinates Systems of Indonesia is DGN95 / Indonesia TM-3 zone 54.1.
  • Exclude all the outer islands from the DKI Jakarta sf data frame, and
  • Retain the first nine fields in the DKI Jakarta sf data frame. The ninth field JUMLAH_PEN = Total Population.

4 Getting Started

4.1 Installing and Loading R packages

  • sf: to import, manage, and process geospatial data
  • tidyverse: a collection of packages (readr for importing delimited text file, tidyr for tidying data, dplyr for wrangling data)
  • tmap: provides functions for plotting cartographic quality static point patterns maps or interactive maps
  • sfdep: for spatial dependence of simple features
  • readxl: for importing Excel worksheets(.xlsx)
  • plyr: for splitting data, applying functions and combining results
  • kableExtra: for table customisation
  • Kendall: for Mann-Kendall Test
Show the code!
pacman::p_load(sf, sfdep, readxl, plyr, kableExtra, tmap, Kendall, tidyverse)

4.2 Data Wrangling: Geospatial Data

4.2.1 Importing the Geospatial Data

Show the code!
# bd stands for "batas desa", translated as "village boundary"
# reads in geospatial data and stores into bd_jakarta dataframe
bd_jakarta <- st_read(dsn = "data/geospatial",
                       layer = "BATAS_DESA_DESEMBER_2019_DUKCAPIL_DKI_JAKARTA")
Reading layer `BATAS_DESA_DESEMBER_2019_DUKCAPIL_DKI_JAKARTA' from data source 
  `C:\valtyl\IS415-GAA\Take-home_Ex\Take-home_Ex02\data\geospatial' 
  using driver `ESRI Shapefile'
Simple feature collection with 269 features and 161 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 106.3831 ymin: -6.370815 xmax: 106.9728 ymax: -5.184322
Geodetic CRS:  WGS 84

From the output message, we learn that: - Geometry type: Multipolygon - 269 features, 161 fields - Assigned CRS is WGS 84, ‘World Geodetic System 1984’ (This is not appropriate as this geospatial dataset is Indonesian-specific hence we will have to use the national CRS of Indonesia, DGN 95, ‘Datum Geodesi Nasional 1995’. We will change this later on.) (Refer to note in section 3.2)

4.2.2 Data Pre-Processing

Before visualising our data, we need to check if there are: - invalid geometries - or missing values These can impact future calculations and representations

4.2.2.1 Invalid Geometries

Checking for invalid geometries:

Show the code!
# function breakdown:
# the st_is_valid function checks whether a geometry is valid
# which returns the indices of certain values based on logical conditions
# length returns the length of data objects

# checks for the number of geometries that are NOT valid
length(which(st_is_valid(bd_jakarta) == FALSE))
[1] 0

The message output shows that there are no invalid geometries.

4.2.2.2 Missing Values

Show the code!
# the rowSums(is.na(bd_jakarta))!=0 checks every row if there are NA values, returning TRUE or FALSE
# the bd_jakarta 'wrapper' prints said rows that contain NA values
bd_jakarta[rowSums(is.na(bd_jakarta))!=0,]
Simple feature collection with 2 features and 161 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 106.8412 ymin: -6.154036 xmax: 106.8612 ymax: -6.144973
Geodetic CRS:  WGS 84
    OBJECT_ID KODE_DESA             DESA   KODE    PROVINSI KAB_KOTA KECAMATAN
243     25645  31888888     DANAU SUNTER 318888 DKI JAKARTA     <NA>      <NA>
244     25646  31888888 DANAU SUNTER DLL 318888 DKI JAKARTA     <NA>      <NA>
    DESA_KELUR JUMLAH_PEN JUMLAH_KK LUAS_WILAY KEPADATAN PERPINDAHA JUMLAH_MEN
243       <NA>          0         0          0         0          0          0
244       <NA>          0         0          0         0          0          0
    PERUBAHAN WAJIB_KTP SILAM KRISTEN KHATOLIK HINDU BUDHA KONGHUCU KEPERCAYAA
243         0         0     0       0        0     0     0        0          0
244         0         0     0       0        0     0     0        0          0
    PRIA WANITA BELUM_KAWI KAWIN CERAI_HIDU CERAI_MATI U0 U5 U10 U15 U20 U25
243    0      0          0     0          0          0  0  0   0   0   0   0
244    0      0          0     0          0          0  0  0   0   0   0   0
    U30 U35 U40 U45 U50 U55 U60 U65 U70 U75 TIDAK_BELU BELUM_TAMA TAMAT_SD SLTP
243   0   0   0   0   0   0   0   0   0   0          0          0        0    0
244   0   0   0   0   0   0   0   0   0   0          0          0        0    0
    SLTA DIPLOMA_I DIPLOMA_II DIPLOMA_IV STRATA_II STRATA_III BELUM_TIDA
243    0         0          0          0         0          0          0
244    0         0          0          0         0          0          0
    APARATUR_P TENAGA_PEN WIRASWASTA PERTANIAN NELAYAN AGAMA_DAN PELAJAR_MA
243          0          0          0         0       0         0          0
244          0          0          0         0       0         0          0
    TENAGA_KES PENSIUNAN LAINNYA GENERATED KODE_DES_1 BELUM_ MENGUR_ PELAJAR_
243          0         0       0      <NA>       <NA>      0       0        0
244          0         0       0      <NA>       <NA>      0       0        0
    PENSIUNA_1 PEGAWAI_ TENTARA KEPOLISIAN PERDAG_ PETANI PETERN_ NELAYAN_1
243          0        0       0          0       0      0       0         0
244          0        0       0          0       0      0       0         0
    INDUSTR_ KONSTR_ TRANSP_ KARYAW_ KARYAW1 KARYAW1_1 KARYAW1_12 BURUH BURUH_
243        0       0       0       0       0         0          0     0      0
244        0       0       0       0       0         0          0     0      0
    BURUH1 BURUH1_1 PEMBANT_ TUKANG TUKANG_1 TUKANG_12 TUKANG__13 TUKANG__14
243      0        0        0      0        0         0          0          0
244      0        0        0      0        0         0          0          0
    TUKANG__15 TUKANG__16 TUKANG__17 PENATA PENATA_ PENATA1_1 MEKANIK SENIMAN_
243          0          0          0      0       0         0       0        0
244          0          0          0      0       0         0       0        0
    TABIB PARAJI_ PERANCA_ PENTER_ IMAM_M PENDETA PASTOR WARTAWAN USTADZ JURU_M
243     0       0        0       0      0       0      0        0      0      0
244     0       0        0       0      0       0      0        0      0      0
    PROMOT ANGGOTA_ ANGGOTA1 ANGGOTA1_1 PRESIDEN WAKIL_PRES ANGGOTA1_2
243      0        0        0          0        0          0          0
244      0        0        0          0        0          0          0
    ANGGOTA1_3 DUTA_B GUBERNUR WAKIL_GUBE BUPATI WAKIL_BUPA WALIKOTA WAKIL_WALI
243          0      0        0          0      0          0        0          0
244          0      0        0          0      0          0        0          0
    ANGGOTA1_4 ANGGOTA1_5 DOSEN GURU PILOT PENGACARA_ NOTARIS ARSITEK AKUNTA_
243          0          0     0    0     0          0       0       0       0
244          0          0     0    0     0          0       0       0       0
    KONSUL_ DOKTER BIDAN PERAWAT APOTEK_ PSIKIATER PENYIA_ PENYIA1 PELAUT
243       0      0     0       0       0         0       0       0      0
244       0      0     0       0       0         0       0       0      0
    PENELITI SOPIR PIALAN PARANORMAL PEDAGA_ PERANG_ KEPALA_ BIARAW_ WIRASWAST_
243        0     0      0          0       0       0       0       0          0
244        0     0      0          0       0       0       0       0          0
    LAINNYA_12 LUAS_DESA KODE_DES_3 DESA_KEL_1 KODE_12
243          0         0       <NA>       <NA>       0
244          0         0       <NA>       <NA>       0
                          geometry
243 MULTIPOLYGON (((106.8612 -6...
244 MULTIPOLYGON (((106.8504 -6...

The message output shows that there are 2 rows with missing values for the columns KAB_KOTA (City), KECAMATAN (District), DESA_KELUR (Village) and a few more others. We can also see that there are way too many columns, and we will remove the unnecessary columns later on.

To clean up, we will remove the rows that have NA values in DESA_KELUR since we are interested in the dataset on a sub-district level:

Show the code!
# removes rows that have an NA value in DESA_KELUR
# in context of this data, we can use other columns, such as KAB_KOTA or KECAMATAN
# but since we're looking at this on a sub-district level, DESA_KELUR seemed most appropriate
bd_jakarta <- na.omit(bd_jakarta,c("DESA_KELUR"))

4.2.2.3 Verifying & Transforming the Coordinate System

Checking the CRS of bd_jakarta:

Show the code!
# retrieves the coordinate system of bd_jakarta
st_crs(bd_jakarta)
Coordinate Reference System:
  User input: WGS 84 
  wkt:
GEOGCRS["WGS 84",
    DATUM["World Geodetic System 1984",
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["latitude",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["longitude",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    ID["EPSG",4326]]

As mentioned in section 4.2.1, WGS 84 is not appropriate and we should change it to DGN 95:

Show the code!
# transforms the CRS to DGN95, ESPG code 23845
bd_jakarta <- st_transform(bd_jakarta, 23845)

Checking if the CRS has been properly assigned:

Show the code!
st_crs(bd_jakarta)
Coordinate Reference System:
  User input: EPSG:23845 
  wkt:
PROJCRS["DGN95 / Indonesia TM-3 zone 54.1",
    BASEGEOGCRS["DGN95",
        DATUM["Datum Geodesi Nasional 1995",
            ELLIPSOID["WGS 84",6378137,298.257223563,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",4755]],
    CONVERSION["Indonesia TM-3 zone 54.1",
        METHOD["Transverse Mercator",
            ID["EPSG",9807]],
        PARAMETER["Latitude of natural origin",0,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8801]],
        PARAMETER["Longitude of natural origin",139.5,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8802]],
        PARAMETER["Scale factor at natural origin",0.9999,
            SCALEUNIT["unity",1],
            ID["EPSG",8805]],
        PARAMETER["False easting",200000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8806]],
        PARAMETER["False northing",1500000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8807]]],
    CS[Cartesian,2],
        AXIS["easting (X)",east,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["northing (Y)",north,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["Cadastre."],
        AREA["Indonesia - onshore east of 138°E."],
        BBOX[-9.19,138,-1.49,141.01]],
    ID["EPSG",23845]]

The transformation is done.

4.2.3 Data Visualisation

First, we will visualise the geometry of Jakarta:

Show the code!
plot(st_geometry(bd_jakarta))

From the output, it shows that bd_jakarta includes the main land but also many other outer islands that we are not relevant to our analysis in this assignment. (Refer to note in section 3.2)

To remove the outer islands, we should look at how unique values at the City level, KAB_KOTA:

Show the code!
# outputs unique values of the KAB_KOTA field
unique(bd_jakarta$"KAB_KOTA")
[1] "JAKARTA BARAT"    "JAKARTA PUSAT"    "KEPULAUAN SERIBU" "JAKARTA UTARA"   
[5] "JAKARTA TIMUR"    "JAKARTA SELATAN" 

From the output, the cities within Jakarta have a JAKARTA prefix, while KEPULAUAN SERIBU (which means ‘Thousand Islands’) refers to the outer islands. Visualising KAB_KOTA will confirm this:

Show the code!
# with bd_jakarta as the input data (setting the 'base')
# draw the KAB_KOTA (city) polygons
# essentially shades the map according to the city divisions
tm_shape(bd_jakarta) + 
  tm_polygons("KAB_KOTA")

The above visualisation proves that KEPULAUAN SERIBU are the outer islands to remove:

Show the code!
# filters out the outer islands by accepting only if the value of KAB_KOTA is NOT KEPULAUAN SERIBU
bd_jakarta <- filter(bd_jakarta, KAB_KOTA != "KEPULAUAN SERIBU")

4.2.4 Retaining relavant columns only

As seen in section 4.2.2.2, there were many unnecessary and irrelevant columns that we could remove. (Refer to note in section 3.2)

Retaining the relevant fields (first 9 fields) to our analysis:

Show the code!
# filters out other fields by accepting only the first 9 fields
bd_jakarta <- bd_jakarta[, 0:9]

4.2.5 Renaming the Columns in English

For ease of comprehension:

Show the code!
# with reference to: https://www.codegrepper.com/code-examples/r/rename+column+name+in+r
# renames the columns in the style New_Name = OLD_NAME
bd_jakarta <- bd_jakarta %>% 
  dplyr::rename(
    Object_ID=OBJECT_ID,
    Province=PROVINSI, 
    City=KAB_KOTA, 
    District=KECAMATAN, 
    Village_Code=KODE_DESA, 
    Village=DESA, 
    Sub_District=DESA_KELUR,
    Code=KODE, 
    Total_Population=JUMLAH_PEN
    )

4.2.6 Brief EDA of Geospatial Data

Summary of bd_jakarta:

Show the code!
# reveals the data type of all fields + some values
glimpse(bd_jakarta)
Rows: 261
Columns: 10
$ Object_ID        <dbl> 25477, 25478, 25397, 25400, 25390, 25391, 25394, 2538…
$ Village_Code     <chr> "3173031006", "3173031007", "3171031003", "3171031006…
$ Village          <chr> "KEAGUNGAN", "GLODOK", "HARAPAN MULIA", "CEMPAKA BARU…
$ Code             <dbl> 317303, 317303, 317103, 317103, 317102, 317102, 31710…
$ Province         <chr> "DKI JAKARTA", "DKI JAKARTA", "DKI JAKARTA", "DKI JAK…
$ City             <chr> "JAKARTA BARAT", "JAKARTA BARAT", "JAKARTA PUSAT", "J…
$ District         <chr> "TAMAN SARI", "TAMAN SARI", "KEMAYORAN", "KEMAYORAN",…
$ Sub_District     <chr> "KEAGUNGAN", "GLODOK", "HARAPAN MULIA", "CEMPAKA BARU…
$ Total_Population <dbl> 21609, 9069, 29085, 41913, 15793, 33383, 35906, 21828…
$ geometry         <MULTIPOLYGON [m]> MULTIPOLYGON (((-3626874 69..., MULTIPOL…

Number of unique sub-districts:

Show the code!
length(unique(bd_jakarta$"Sub_District"))
[1] 261

Number of unique districts:

Show the code!
length(unique(bd_jakarta$"District"))
[1] 42

Number of unique cities:

Show the code!
length(unique(bd_jakarta$"City"))
[1] 5

There are 261 unique sub-districts, 42 unique districts and 5 unique cities. The maximum number of categories for mapping with tmap is 30. Even though max.categories can be adjusted in tmap_options, too many segmented sections on a single map will not provide much insights hence we should do the EDA at ‘City’ level:

Show the code!
# shades the map according to the city divisions
tm_shape(bd_jakarta) + 
  tm_polygons("City")

4.3 Data Wrangling: Aspatial Data

4.3.1 Pre-Importing EDA

For the aspatial data, I have decided to download the data for last day of every month from July 2021 to June 2022. However, the last day of Feb 2022 provided on the website in section 3.1 is 27 Feb instead of 28 Feb.

This section is to check for any discrepancies in each .xlsx file in the ‘data/aspatial’ folder by performing EDA:

Show the code!
jul2021 <- read_xlsx("data/aspatial/Data Vaksinasi Berbasis Kelurahan (31 Juli 2021).xlsx")
glimpse(jul2021)
Rows: 268
Columns: 27
$ `KODE KELURAHAN`                             <chr> NA, "3172051003", "317304…
$ `WILAYAH KOTA`                               <chr> NA, "JAKARTA UTARA", "JAK…
$ KECAMATAN                                    <chr> NA, "PADEMANGAN", "TAMBOR…
$ KELURAHAN                                    <chr> "TOTAL", "ANCOL", "ANGKE"…
$ SASARAN                                      <dbl> 8941211, 23947, 29381, 29…
$ `BELUM VAKSIN`                               <dbl> 4441501, 12333, 13875, 18…
$ `JUMLAH\r\nDOSIS 1`                          <dbl> 4499710, 11614, 15506, 10…
$ `JUMLAH\r\nDOSIS 2`                          <dbl> 1663218, 4181, 4798, 3658…
$ `TOTAL VAKSIN\r\nDIBERIKAN`                  <dbl> 6162928, 15795, 20304, 14…
$ `LANSIA\r\nDOSIS 1`                          <dbl> 502579, 1230, 2012, 865, …
$ `LANSIA\r\nDOSIS 2`                          <dbl> 440910, 1069, 1729, 701, …
$ `LANSIA TOTAL \r\nVAKSIN DIBERIKAN`          <dbl> 943489, 2299, 3741, 1566,…
$ `PELAYAN PUBLIK\r\nDOSIS 1`                  <dbl> 1052883, 3333, 2586, 2837…
$ `PELAYAN PUBLIK\r\nDOSIS 2`                  <dbl> 666009, 2158, 1374, 1761,…
$ `PELAYAN PUBLIK TOTAL\r\nVAKSIN DIBERIKAN`   <dbl> 1718892, 5491, 3960, 4598…
$ `GOTONG ROYONG\r\nDOSIS 1`                   <dbl> 56660, 78, 122, 174, 71, …
$ `GOTONG ROYONG\r\nDOSIS 2`                   <dbl> 38496, 51, 84, 106, 57, 7…
$ `GOTONG ROYONG TOTAL\r\nVAKSIN DIBERIKAN`    <dbl> 95156, 129, 206, 280, 128…
$ `TENAGA KESEHATAN\r\nDOSIS 1`                <dbl> 76397, 101, 90, 215, 73, …
$ `TENAGA KESEHATAN\r\nDOSIS 2`                <dbl> 67484, 91, 82, 192, 67, 3…
$ `TENAGA KESEHATAN TOTAL\r\nVAKSIN DIBERIKAN` <dbl> 143881, 192, 172, 407, 14…
$ `TAHAPAN 3\r\nDOSIS 1`                       <dbl> 2279398, 5506, 9012, 5408…
$ `TAHAPAN 3\r\nDOSIS 2`                       <dbl> 446028, 789, 1519, 897, 4…
$ `TAHAPAN 3 TOTAL\r\nVAKSIN DIBERIKAN`        <dbl> 2725426, 6295, 10531, 630…
$ `REMAJA\r\nDOSIS 1`                          <dbl> 531793, 1366, 1684, 1261,…
$ `REMAJA\r\nDOSIS 2`                          <dbl> 4291, 23, 10, 1, 1, 8, 6,…
$ `REMAJA TOTAL\r\nVAKSIN DIBERIKAN`           <dbl> 536084, 1389, 1694, 1262,…

The above output shows that there are no duplicates for the columns.

Below, similar codes were used to check for the other excel files. There are no duplicates in the rest of the files. But, the excel files for July 2021 to February 2022 have 27 columns while those for March 2022 to June 2022 have 34 columns.

Show the code!
aug2021 <- read_xlsx("data/aspatial/Data Vaksinasi Berbasis Kelurahan (31 Agustus 2021).xlsx")
glimpse(aug2021)
Rows: 268
Columns: 27
$ `KODE KELURAHAN`                             <chr> NA, "3172051003", "317304…
$ `WILAYAH KOTA`                               <chr> NA, "JAKARTA UTARA", "JAK…
$ KECAMATAN                                    <chr> NA, "PADEMANGAN", "TAMBOR…
$ KELURAHAN                                    <chr> "TOTAL", "ANCOL", "ANGKE"…
$ SASARAN                                      <dbl> 8941211, 23947, 29381, 29…
$ `BELUM VAKSIN`                               <dbl> 3277484, 9191, 10400, 125…
$ `JUMLAH\r\nDOSIS 1`                          <dbl> 5663727, 14756, 18981, 16…
$ `JUMLAH\r\nDOSIS 2`                          <dbl> 3412906, 8935, 10470, 776…
$ `TOTAL VAKSIN\r\nDIBERIKAN`                  <dbl> 9076633, 23691, 29451, 24…
$ `LANSIA\r\nDOSIS 1`                          <dbl> 535001, 1300, 2104, 1043,…
$ `LANSIA\r\nDOSIS 2`                          <dbl> 468678, 1140, 1849, 780, …
$ `LANSIA TOTAL \r\nVAKSIN DIBERIKAN`          <dbl> 1003679, 2440, 3953, 1823…
$ `PELAYAN PUBLIK\r\nDOSIS 1`                  <dbl> 1393352, 4194, 3643, 4293…
$ `PELAYAN PUBLIK\r\nDOSIS 2`                  <dbl> 1007921, 3135, 2519, 2548…
$ `PELAYAN PUBLIK TOTAL\r\nVAKSIN DIBERIKAN`   <dbl> 2401273, 7329, 6162, 6841…
$ `GOTONG ROYONG\r\nDOSIS 1`                   <dbl> 65340, 89, 137, 188, 80, …
$ `GOTONG ROYONG\r\nDOSIS 2`                   <dbl> 53995, 77, 119, 163, 71, …
$ `GOTONG ROYONG TOTAL\r\nVAKSIN DIBERIKAN`    <dbl> 119335, 166, 256, 351, 15…
$ `TENAGA KESEHATAN\r\nDOSIS 1`                <dbl> 79502, 106, 92, 229, 78, …
$ `TENAGA KESEHATAN\r\nDOSIS 2`                <dbl> 72588, 96, 83, 203, 74, 3…
$ `TENAGA KESEHATAN TOTAL\r\nVAKSIN DIBERIKAN` <dbl> 152090, 202, 175, 432, 15…
$ `TAHAPAN 3\r\nDOSIS 1`                       <dbl> 2941837, 7385, 11033, 872…
$ `TAHAPAN 3\r\nDOSIS 2`                       <dbl> 1377349, 3277, 4541, 3010…
$ `TAHAPAN 3 TOTAL\r\nVAKSIN DIBERIKAN`        <dbl> 4319186, 10662, 15574, 11…
$ `REMAJA\r\nDOSIS 1`                          <dbl> 648695, 1682, 1972, 2090,…
$ `REMAJA\r\nDOSIS 2`                          <dbl> 432375, 1210, 1359, 1062,…
$ `REMAJA TOTAL\r\nVAKSIN DIBERIKAN`           <dbl> 1081070, 2892, 3331, 3152…
Show the code!
sep2021 <- read_xlsx("data/aspatial/Data Vaksinasi Berbasis Kelurahan (30 September 2021).xlsx")
glimpse(sep2021)
Rows: 268
Columns: 27
$ `KODE KELURAHAN`                             <chr> NA, "3172051003", "317304…
$ `WILAYAH KOTA`                               <chr> NA, "JAKARTA UTARA", "JAK…
$ KECAMATAN                                    <chr> NA, "PADEMANGAN", "TAMBOR…
$ KELURAHAN                                    <chr> "TOTAL", "ANCOL", "ANGKE"…
$ SASARAN                                      <dbl> 8941211, 23947, 29381, 29…
$ `BELUM VAKSIN`                               <dbl> 2235772, 6688, 7581, 8708…
$ `JUMLAH\r\nDOSIS 1`                          <dbl> 6705439, 17259, 21800, 20…
$ `JUMLAH\r\nDOSIS 2`                          <dbl> 5171697, 13376, 16438, 14…
$ `TOTAL VAKSIN\r\nDIBERIKAN`                  <dbl> 11877136, 30635, 38238, 3…
$ `LANSIA\r\nDOSIS 1`                          <dbl> 587215, 1417, 2270, 1263,…
$ `LANSIA\r\nDOSIS 2`                          <dbl> 518944, 1263, 2033, 988, …
$ `LANSIA TOTAL \r\nVAKSIN DIBERIKAN`          <dbl> 1106159, 2680, 4303, 2251…
$ `PELAYAN PUBLIK\r\nDOSIS 1`                  <dbl> 1468382, 3938, 3883, 4540…
$ `PELAYAN PUBLIK\r\nDOSIS 2`                  <dbl> 1305200, 3454, 3356, 3903…
$ `PELAYAN PUBLIK TOTAL\r\nVAKSIN DIBERIKAN`   <dbl> 2773582, 7392, 7239, 8443…
$ `GOTONG ROYONG\r\nDOSIS 1`                   <dbl> 84049, 158, 173, 248, 100…
$ `GOTONG ROYONG\r\nDOSIS 2`                   <dbl> 75657, 148, 157, 229, 91,…
$ `GOTONG ROYONG TOTAL\r\nVAKSIN DIBERIKAN`    <dbl> 159706, 306, 330, 477, 19…
$ `TENAGA KESEHATAN\r\nDOSIS 1`                <dbl> 112296, 140, 135, 329, 11…
$ `TENAGA KESEHATAN\r\nDOSIS 2`                <dbl> 104381, 124, 125, 300, 11…
$ `TENAGA KESEHATAN TOTAL\r\nVAKSIN DIBERIKAN` <dbl> 216677, 264, 260, 629, 23…
$ `TAHAPAN 3\r\nDOSIS 1`                       <dbl> 3677943, 9564, 12969, 114…
$ `TAHAPAN 3\r\nDOSIS 2`                       <dbl> 2548057, 6788, 8944, 7023…
$ `TAHAPAN 3 TOTAL\r\nVAKSIN DIBERIKAN`        <dbl> 6226000, 16352, 21913, 18…
$ `REMAJA\r\nDOSIS 1`                          <dbl> 775554, 2042, 2370, 2510,…
$ `REMAJA\r\nDOSIS 2`                          <dbl> 619458, 1599, 1823, 1969,…
$ `REMAJA TOTAL\r\nVAKSIN DIBERIKAN`           <dbl> 1395012, 3641, 4193, 4479…
Show the code!
oct2021 <- read_xlsx("data/aspatial/Data Vaksinasi Berbasis Kelurahan (31 Oktober 2021).xlsx")
glimpse(oct2021)
Rows: 268
Columns: 27
$ `KODE KELURAHAN`                             <chr> NA, "3172051003", "317304…
$ `WILAYAH KOTA`                               <chr> NA, "JAKARTA UTARA", "JAK…
$ KECAMATAN                                    <chr> NA, "PADEMANGAN", "TAMBOR…
$ KELURAHAN                                    <chr> "TOTAL", "ANCOL", "ANGKE"…
$ SASARAN                                      <dbl> 8941211, 23947, 29381, 29…
$ `BELUM VAKSIN`                               <dbl> 1880524, 5991, 6557, 7586…
$ `JUMLAH\r\nDOSIS 1`                          <dbl> 7060687, 17956, 22824, 21…
$ `JUMLAH\r\nDOSIS 2`                          <dbl> 5729001, 14504, 18185, 16…
$ `TOTAL VAKSIN\r\nDIBERIKAN`                  <dbl> 12789688, 32460, 41009, 3…
$ `LANSIA\r\nDOSIS 1`                          <dbl> 608940, 1447, 2336, 1322,…
$ `LANSIA\r\nDOSIS 2`                          <dbl> 543483, 1296, 2104, 1104,…
$ `LANSIA TOTAL \r\nVAKSIN DIBERIKAN`          <dbl> 1152423, 2743, 4440, 2426…
$ `PELAYAN PUBLIK\r\nDOSIS 1`                  <dbl> 1484292, 3972, 3917, 4595…
$ `PELAYAN PUBLIK\r\nDOSIS 2`                  <dbl> 1349105, 3555, 3465, 4072…
$ `PELAYAN PUBLIK TOTAL\r\nVAKSIN DIBERIKAN`   <dbl> 2833397, 7527, 7382, 8667…
$ `GOTONG ROYONG\r\nDOSIS 1`                   <dbl> 86323, 165, 175, 259, 101…
$ `GOTONG ROYONG\r\nDOSIS 2`                   <dbl> 81721, 160, 168, 245, 96,…
$ `GOTONG ROYONG TOTAL\r\nVAKSIN DIBERIKAN`    <dbl> 168044, 325, 343, 504, 19…
$ `TENAGA KESEHATAN\r\nDOSIS 1`                <dbl> 113911, 140, 136, 338, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 2`                <dbl> 107383, 128, 128, 310, 12…
$ `TENAGA KESEHATAN TOTAL\r\nVAKSIN DIBERIKAN` <dbl> 221294, 268, 264, 648, 24…
$ `TAHAPAN 3\r\nDOSIS 1`                       <dbl> 3948804, 10101, 13744, 12…
$ `TAHAPAN 3\r\nDOSIS 2`                       <dbl> 2949023, 7567, 10266, 849…
$ `TAHAPAN 3 TOTAL\r\nVAKSIN DIBERIKAN`        <dbl> 6897827, 17668, 24010, 20…
$ `REMAJA\r\nDOSIS 1`                          <dbl> 818417, 2131, 2516, 2672,…
$ `REMAJA\r\nDOSIS 2`                          <dbl> 698286, 1798, 2054, 2220,…
$ `REMAJA TOTAL\r\nVAKSIN DIBERIKAN`           <dbl> 1516703, 3929, 4570, 4892…
Show the code!
nov2021 <- read_xlsx("data/aspatial/Data Vaksinasi Berbasis Kelurahan (30 November 2021).xlsx")
glimpse(nov2021)
Rows: 268
Columns: 27
$ `KODE KELURAHAN`                             <chr> NA, "3172051003", "317304…
$ `WILAYAH KOTA`                               <chr> NA, "JAKARTA UTARA", "JAK…
$ KECAMATAN                                    <chr> NA, "PADEMANGAN", "TAMBOR…
$ KELURAHAN                                    <chr> "TOTAL", "ANCOL", "ANGKE"…
$ SASARAN                                      <dbl> 8941211, 23947, 29381, 29…
$ `BELUM VAKSIN`                               <dbl> 1723821, 5527, 5986, 6802…
$ `JUMLAH\r\nDOSIS 1`                          <dbl> 7217390, 18420, 23395, 22…
$ `JUMLAH\r\nDOSIS 2`                          <dbl> 6172636, 15466, 19404, 18…
$ `TOTAL VAKSIN\r\nDIBERIKAN`                  <dbl> 13390026, 33886, 42799, 4…
$ `LANSIA\r\nDOSIS 1`                          <dbl> 624751, 1473, 2391, 1385,…
$ `LANSIA\r\nDOSIS 2`                          <dbl> 571830, 1351, 2192, 1224,…
$ `LANSIA TOTAL \r\nVAKSIN DIBERIKAN`          <dbl> 1196581, 2824, 4583, 2609…
$ `PELAYAN PUBLIK\r\nDOSIS 1`                  <dbl> 1487961, 3980, 3926, 4614…
$ `PELAYAN PUBLIK\r\nDOSIS 2`                  <dbl> 1369705, 3601, 3516, 4146…
$ `PELAYAN PUBLIK TOTAL\r\nVAKSIN DIBERIKAN`   <dbl> 2857666, 7581, 7442, 8760…
$ `GOTONG ROYONG\r\nDOSIS 1`                   <dbl> 86710, 169, 176, 259, 101…
$ `GOTONG ROYONG\r\nDOSIS 2`                   <dbl> 83506, 163, 172, 252, 98,…
$ `GOTONG ROYONG TOTAL\r\nVAKSIN DIBERIKAN`    <dbl> 170216, 332, 348, 511, 19…
$ `TENAGA KESEHATAN\r\nDOSIS 1`                <dbl> 114292, 140, 135, 341, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 2`                <dbl> 109221, 128, 128, 323, 12…
$ `TENAGA KESEHATAN TOTAL\r\nVAKSIN DIBERIKAN` <dbl> 223513, 268, 263, 664, 24…
$ `TAHAPAN 3\r\nDOSIS 1`                       <dbl> 4069550, 10473, 14182, 12…
$ `TAHAPAN 3\r\nDOSIS 2`                       <dbl> 3304266, 8329, 11215, 978…
$ `TAHAPAN 3 TOTAL\r\nVAKSIN DIBERIKAN`        <dbl> 7373816, 18802, 25397, 22…
$ `REMAJA\r\nDOSIS 1`                          <dbl> 834126, 2185, 2585, 2733,…
$ `REMAJA\r\nDOSIS 2`                          <dbl> 734108, 1894, 2181, 2355,…
$ `REMAJA TOTAL\r\nVAKSIN DIBERIKAN`           <dbl> 1568234, 4079, 4766, 5088…
Show the code!
dec2021 <- read_xlsx("data/aspatial/Data Vaksinasi Berbasis Kelurahan (31 Desember 2021).xlsx")
glimpse(dec2021)
Rows: 268
Columns: 27
$ `KODE KELURAHAN`                             <chr> NA, "3172051003", "317304…
$ `WILAYAH KOTA`                               <chr> NA, "JAKARTA UTARA", "JAK…
$ KECAMATAN                                    <chr> NA, "PADEMANGAN", "TAMBOR…
$ KELURAHAN                                    <chr> "TOTAL", "ANCOL", "ANGKE"…
$ SASARAN                                      <dbl> 8941211, 23947, 29381, 29…
$ `BELUM VAKSIN`                               <dbl> 1623736, 5062, 5626, 6335…
$ `JUMLAH\r\nDOSIS 1`                          <dbl> 7317475, 18885, 23755, 22…
$ `JUMLAH\r\nDOSIS 2`                          <dbl> 6370175, 15996, 20026, 18…
$ `TOTAL VAKSIN\r\nDIBERIKAN`                  <dbl> 13687650, 34881, 43781, 4…
$ `LANSIA\r\nDOSIS 1`                          <dbl> 634516, 1520, 2427, 1418,…
$ `LANSIA\r\nDOSIS 2`                          <dbl> 586624, 1375, 2247, 1294,…
$ `LANSIA TOTAL \r\nVAKSIN DIBERIKAN`          <dbl> 1221140, 2895, 4674, 2712…
$ `PELAYAN PUBLIK\r\nDOSIS 1`                  <dbl> 1485857, 3981, 3922, 4603…
$ `PELAYAN PUBLIK\r\nDOSIS 2`                  <dbl> 1372180, 3607, 3521, 4153…
$ `PELAYAN PUBLIK TOTAL\r\nVAKSIN DIBERIKAN`   <dbl> 2858037, 7588, 7443, 8756…
$ `GOTONG ROYONG\r\nDOSIS 1`                   <dbl> 86905, 169, 176, 260, 101…
$ `GOTONG ROYONG\r\nDOSIS 2`                   <dbl> 83995, 164, 174, 253, 99,…
$ `GOTONG ROYONG TOTAL\r\nVAKSIN DIBERIKAN`    <dbl> 170900, 333, 350, 513, 20…
$ `TENAGA KESEHATAN\r\nDOSIS 1`                <dbl> 114612, 140, 136, 345, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 2`                <dbl> 110119, 128, 129, 327, 12…
$ `TENAGA KESEHATAN TOTAL\r\nVAKSIN DIBERIKAN` <dbl> 224731, 268, 265, 672, 24…
$ `TAHAPAN 3\r\nDOSIS 1`                       <dbl> 4150113, 10841, 14450, 13…
$ `TAHAPAN 3\r\nDOSIS 2`                       <dbl> 3467714, 8782, 11715, 104…
$ `TAHAPAN 3 TOTAL\r\nVAKSIN DIBERIKAN`        <dbl> 7617827, 19623, 26165, 23…
$ `REMAJA\r\nDOSIS 1`                          <dbl> 845472, 2234, 2644, 2783,…
$ `REMAJA\r\nDOSIS 2`                          <dbl> 749543, 1940, 2240, 2401,…
$ `REMAJA TOTAL\r\nVAKSIN DIBERIKAN`           <dbl> 1595015, 4174, 4884, 5184…
Show the code!
jan2022 <- read_xlsx("data/aspatial/Data Vaksinasi Berbasis Kelurahan (31 Januari 2022).xlsx")
glimpse(jan2022)
Rows: 268
Columns: 27
$ `KODE KELURAHAN`                             <chr> NA, "3172051003", "317304…
$ `WILAYAH KOTA`                               <chr> NA, "JAKARTA UTARA", "JAK…
$ KECAMATAN                                    <chr> NA, "PADEMANGAN", "TAMBOR…
$ KELURAHAN                                    <chr> "TOTAL", "ANCOL", "ANGKE"…
$ SASARAN                                      <dbl> 8941211, 23947, 29381, 29…
$ `BELUM VAKSIN`                               <dbl> 1538221, 4647, 5388, 5967…
$ `JUMLAH\r\nDOSIS 1`                          <dbl> 7402990, 19300, 23993, 23…
$ `JUMLAH\r\nDOSIS 2`                          <dbl> 6516678, 16477, 20463, 19…
$ `TOTAL VAKSIN\r\nDIBERIKAN`                  <dbl> 13919668, 35777, 44456, 4…
$ `LANSIA\r\nDOSIS 1`                          <dbl> 644280, 1564, 2459, 1446,…
$ `LANSIA\r\nDOSIS 2`                          <dbl> 598309, 1399, 2291, 1327,…
$ `LANSIA TOTAL \r\nVAKSIN DIBERIKAN`          <dbl> 1242589, 2963, 4750, 2773…
$ `PELAYAN PUBLIK\r\nDOSIS 1`                  <dbl> 1478564, 3971, 3900, 4592…
$ `PELAYAN PUBLIK\r\nDOSIS 2`                  <dbl> 1369268, 3604, 3506, 4158…
$ `PELAYAN PUBLIK TOTAL\r\nVAKSIN DIBERIKAN`   <dbl> 2847832, 7575, 7406, 8750…
$ `GOTONG ROYONG\r\nDOSIS 1`                   <dbl> 88073, 177, 178, 262, 102…
$ `GOTONG ROYONG\r\nDOSIS 2`                   <dbl> 85942, 171, 179, 260, 99,…
$ `GOTONG ROYONG TOTAL\r\nVAKSIN DIBERIKAN`    <dbl> 174015, 348, 357, 522, 20…
$ `TENAGA KESEHATAN\r\nDOSIS 1`                <dbl> 115123, 140, 135, 348, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 2`                <dbl> 111364, 130, 130, 331, 12…
$ `TENAGA KESEHATAN TOTAL\r\nVAKSIN DIBERIKAN` <dbl> 226487, 270, 265, 679, 24…
$ `TAHAPAN 3\r\nDOSIS 1`                       <dbl> 4215232, 11158, 14620, 13…
$ `TAHAPAN 3\r\nDOSIS 2`                       <dbl> 3579348, 9173, 12024, 109…
$ `TAHAPAN 3 TOTAL\r\nVAKSIN DIBERIKAN`        <dbl> 7794580, 20331, 26644, 24…
$ `REMAJA\r\nDOSIS 1`                          <dbl> 861718, 2290, 2701, 2840,…
$ `REMAJA\r\nDOSIS 2`                          <dbl> 772447, 2000, 2333, 2488,…
$ `REMAJA TOTAL\r\nVAKSIN DIBERIKAN`           <dbl> 1634165, 4290, 5034, 5328…
Show the code!
feb2022 <- read_xlsx("data/aspatial/Data Vaksinasi Berbasis Kelurahan (27 Februari 2022).xlsx")
glimpse(feb2022)
Rows: 268
Columns: 27
$ `KODE KELURAHAN`                             <chr> NA, "3172051003", "317304…
$ `WILAYAH KOTA`                               <chr> NA, "JAKARTA UTARA", "JAK…
$ KECAMATAN                                    <chr> NA, "PADEMANGAN", "TAMBOR…
$ KELURAHAN                                    <chr> "TOTAL", "ANCOL", "ANGKE"…
$ SASARAN                                      <dbl> 8941211, 23947, 29381, 29…
$ `BELUM VAKSIN`                               <dbl> 1517196, 4592, 5319, 5903…
$ `JUMLAH\r\nDOSIS 1`                          <dbl> 7424015, 19355, 24062, 23…
$ `JUMLAH\r\nDOSIS 2`                          <dbl> 6590380, 16687, 20738, 19…
$ `TOTAL VAKSIN\r\nDIBERIKAN`                  <dbl> 14014395, 36042, 44800, 4…
$ `LANSIA\r\nDOSIS 1`                          <dbl> 646481, 1567, 2465, 1451,…
$ `LANSIA\r\nDOSIS 2`                          <dbl> 604751, 1418, 2336, 1348,…
$ `LANSIA TOTAL \r\nVAKSIN DIBERIKAN`          <dbl> 1251232, 2985, 4801, 2799…
$ `PELAYAN PUBLIK\r\nDOSIS 1`                  <dbl> 1478545, 3971, 3899, 4590…
$ `PELAYAN PUBLIK\r\nDOSIS 2`                  <dbl> 1371190, 3614, 3512, 4161…
$ `PELAYAN PUBLIK TOTAL\r\nVAKSIN DIBERIKAN`   <dbl> 2849735, 7585, 7411, 8751…
$ `GOTONG ROYONG\r\nDOSIS 1`                   <dbl> 88088, 178, 178, 262, 102…
$ `GOTONG ROYONG\r\nDOSIS 2`                   <dbl> 86046, 171, 179, 260, 99,…
$ `GOTONG ROYONG TOTAL\r\nVAKSIN DIBERIKAN`    <dbl> 174134, 349, 357, 522, 20…
$ `TENAGA KESEHATAN\r\nDOSIS 1`                <dbl> 115186, 140, 135, 348, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 2`                <dbl> 111623, 130, 130, 331, 12…
$ `TENAGA KESEHATAN TOTAL\r\nVAKSIN DIBERIKAN` <dbl> 226809, 270, 265, 679, 24…
$ `TAHAPAN 3\r\nDOSIS 1`                       <dbl> 4232389, 11200, 14670, 13…
$ `TAHAPAN 3\r\nDOSIS 2`                       <dbl> 3638187, 9327, 12227, 111…
$ `TAHAPAN 3 TOTAL\r\nVAKSIN DIBERIKAN`        <dbl> 7870576, 20527, 26897, 24…
$ `REMAJA\r\nDOSIS 1`                          <dbl> 863326, 2299, 2715, 2845,…
$ `REMAJA\r\nDOSIS 2`                          <dbl> 778583, 2027, 2354, 2512,…
$ `REMAJA TOTAL\r\nVAKSIN DIBERIKAN`           <dbl> 1641909, 4326, 5069, 5357…
Show the code!
mar2022 <- read_xlsx("data/aspatial/Data Vaksinasi Berbasis Kelurahan (31 Maret 2022).xlsx")
glimpse(mar2022)
Rows: 268
Columns: 34
$ `KODE KELURAHAN`                             <chr> NA, "3172051003", "317304…
$ `WILAYAH KOTA`                               <chr> NA, "JAKARTA UTARA", "JAK…
$ KECAMATAN                                    <chr> NA, "PADEMANGAN", "TAMBOR…
$ KELURAHAN                                    <chr> "TOTAL", "ANCOL", "ANGKE"…
$ SASARAN                                      <dbl> 8941211, 23947, 29381, 29…
$ `BELUM VAKSIN`                               <dbl> 1482471, 4522, 5186, 5780…
$ `JUMLAH\r\nDOSIS 1`                          <dbl> 7458740, 19425, 24195, 23…
$ `JUMLAH\r\nDOSIS 2`                          <dbl> 6682911, 16909, 21000, 20…
$ `JUMLAH\r\nDOSIS 3`                          <dbl> 1836511, 3934, 6122, 4124…
$ `TOTAL VAKSIN\r\nDIBERIKAN`                  <dbl> 15978162, 40268, 51317, 4…
$ `LANSIA\r\nDOSIS 1`                          <dbl> 649601, 1574, 2475, 1457,…
$ `LANSIA\r\nDOSIS 2`                          <dbl> 610754, 1433, 2350, 1366,…
$ `LANSIA\r\nDOSIS 3`                          <dbl> 610754, 1433, 2350, 1366,…
$ `LANSIA TOTAL \r\nVAKSIN DIBERIKAN`          <dbl> 1533150, 3545, 6052, 3283…
$ `PELAYAN PUBLIK\r\nDOSIS 1`                  <dbl> 1481237, 3980, 3910, 4604…
$ `PELAYAN PUBLIK\r\nDOSIS 2`                  <dbl> 1375686, 3634, 3523, 4175…
$ `PELAYAN PUBLIK\r\nDOSIS 3`                  <dbl> 200536, 579, 660, 453, 24…
$ `PELAYAN PUBLIK TOTAL\r\nVAKSIN DIBERIKAN`   <dbl> 3057459, 8193, 8093, 9232…
$ `GOTONG ROYONG\r\nDOSIS 1`                   <dbl> 88150, 178, 178, 262, 102…
$ `GOTONG ROYONG\r\nDOSIS 2`                   <dbl> 86122, 173, 179, 260, 99,…
$ `GOTONG ROYONG\r\nDOSIS 3`                   <dbl> 19460, 22, 53, 57, 19, 41…
$ `GOTONG ROYONG TOTAL\r\nVAKSIN DIBERIKAN`    <dbl> 193732, 373, 410, 579, 22…
$ `TENAGA KESEHATAN\r\nDOSIS 1`                <dbl> 115527, 140, 135, 348, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 2`                <dbl> 112027, 130, 130, 331, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 3`                <dbl> 84640, 103, 94, 239, 83, …
$ `TENAGA KESEHATAN TOTAL\r\nVAKSIN DIBERIKAN` <dbl> 312194, 373, 359, 918, 32…
$ `TAHAPAN 3\r\nDOSIS 1`                       <dbl> 4258776, 11250, 14773, 13…
$ `TAHAPAN 3\r\nDOSIS 2`                       <dbl> 3715052, 9502, 12436, 114…
$ `TAHAPAN 3\r\nDOSIS 3`                       <dbl> 1248211, 2671, 4048, 2891…
$ `TAHAPAN 3 TOTAL\r\nVAKSIN DIBERIKAN`        <dbl> 9222039, 23423, 31257, 28…
$ `REMAJA\r\nDOSIS 1`                          <dbl> 865449, 2303, 2724, 2851,…
$ `REMAJA\r\nDOSIS 2`                          <dbl> 783270, 2037, 2382, 2541,…
$ `REMAJA\r\nDOSIS 3`                          <dbl> 10869, 21, 40, 24, 7, 28,…
$ `REMAJA TOTAL\r\nVAKSIN DIBERIKAN`           <dbl> 1659588, 4361, 5146, 5416…
Show the code!
apr2022 <- read_xlsx("data/aspatial/Data Vaksinasi Berbasis Kelurahan (30 April 2022).xlsx")
glimpse(apr2022)
Rows: 268
Columns: 34
$ `KODE KELURAHAN`                             <chr> NA, "3172051003", "317304…
$ `WILAYAH KOTA`                               <chr> NA, "JAKARTA UTARA", "JAK…
$ KECAMATAN                                    <chr> NA, "PADEMANGAN", "TAMBOR…
$ KELURAHAN                                    <chr> "TOTAL", "ANCOL", "ANGKE"…
$ SASARAN                                      <dbl> 8941211, 23947, 29381, 29…
$ `BELUM VAKSIN`                               <dbl> 1453423, 4449, 5101, 5699…
$ `JUMLAH\r\nDOSIS 1`                          <dbl> 7487788, 19498, 24280, 23…
$ `JUMLAH\r\nDOSIS 2`                          <dbl> 6727002, 17027, 21134, 20…
$ `JUMLAH\r\nDOSIS 3`                          <dbl> 2720796, 6568, 8915, 6491…
$ `TOTAL VAKSIN\r\nDIBERIKAN`                  <dbl> 16935586, 43093, 54329, 5…
$ `LANSIA\r\nDOSIS 1`                          <dbl> 651696, 1579, 2481, 1458,…
$ `LANSIA\r\nDOSIS 2`                          <dbl> 613044, 1441, 2360, 1376,…
$ `LANSIA\r\nDOSIS 3`                          <dbl> 613044, 1441, 2360, 1376,…
$ `LANSIA TOTAL \r\nVAKSIN DIBERIKAN`          <dbl> 1599248, 3750, 6301, 3425…
$ `PELAYAN PUBLIK\r\nDOSIS 1`                  <dbl> 1483630, 3983, 3920, 4611…
$ `PELAYAN PUBLIK\r\nDOSIS 2`                  <dbl> 1378338, 3640, 3529, 4187…
$ `PELAYAN PUBLIK\r\nDOSIS 3`                  <dbl> 366145, 1099, 1096, 941, …
$ `PELAYAN PUBLIK TOTAL\r\nVAKSIN DIBERIKAN`   <dbl> 3228113, 8722, 8545, 9739…
$ `GOTONG ROYONG\r\nDOSIS 1`                   <dbl> 88200, 178, 178, 262, 102…
$ `GOTONG ROYONG\r\nDOSIS 2`                   <dbl> 86184, 173, 179, 260, 99,…
$ `GOTONG ROYONG\r\nDOSIS 3`                   <dbl> 38179, 71, 95, 120, 41, 7…
$ `GOTONG ROYONG TOTAL\r\nVAKSIN DIBERIKAN`    <dbl> 212563, 422, 452, 642, 24…
$ `TENAGA KESEHATAN\r\nDOSIS 1`                <dbl> 115623, 140, 135, 348, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 2`                <dbl> 112253, 130, 130, 333, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 3`                <dbl> 89811, 109, 105, 259, 91,…
$ `TENAGA KESEHATAN TOTAL\r\nVAKSIN DIBERIKAN` <dbl> 317687, 379, 370, 940, 33…
$ `TAHAPAN 3\r\nDOSIS 1`                       <dbl> 4281576, 11308, 14842, 13…
$ `TAHAPAN 3\r\nDOSIS 2`                       <dbl> 3750893, 9596, 12545, 116…
$ `TAHAPAN 3\r\nDOSIS 3`                       <dbl> 1866526, 4503, 6084, 4519…
$ `TAHAPAN 3 TOTAL\r\nVAKSIN DIBERIKAN`        <dbl> 9898995, 25407, 33471, 29…
$ `REMAJA\r\nDOSIS 1`                          <dbl> 867063, 2310, 2724, 2858,…
$ `REMAJA\r\nDOSIS 2`                          <dbl> 786290, 2047, 2391, 2557,…
$ `REMAJA\r\nDOSIS 3`                          <dbl> 25627, 56, 75, 61, 19, 71…
$ `REMAJA TOTAL\r\nVAKSIN DIBERIKAN`           <dbl> 1678980, 4413, 5190, 5476…
Show the code!
may2022 <- read_xlsx("data/aspatial/Data Vaksinasi Berbasis Kelurahan (31 Mei 2022).xlsx")
glimpse(may2022)
Rows: 268
Columns: 34
$ `KODE KELURAHAN`                             <chr> NA, "3172051003", "317304…
$ `WILAYAH KOTA`                               <chr> NA, "JAKARTA UTARA", "JAK…
$ KECAMATAN                                    <chr> NA, "PADEMANGAN", "TAMBOR…
$ KELURAHAN                                    <chr> "TOTAL", "ANCOL", "ANGKE"…
$ SASARAN                                      <dbl> 8941211, 23947, 29381, 29…
$ `BELUM VAKSIN`                               <dbl> 1445540, 4440, 5084, 5676…
$ `JUMLAH\r\nDOSIS 1`                          <dbl> 7495671, 19507, 24297, 23…
$ `JUMLAH\r\nDOSIS 2`                          <dbl> 6743764, 17077, 21182, 20…
$ `JUMLAH\r\nDOSIS 3`                          <dbl> 2885301, 7022, 9484, 7030…
$ `TOTAL VAKSIN\r\nDIBERIKAN`                  <dbl> 17124736, 43606, 54963, 5…
$ `LANSIA\r\nDOSIS 1`                          <dbl> 652411, 1580, 2482, 1461,…
$ `LANSIA\r\nDOSIS 2`                          <dbl> 614259, 1442, 2367, 1378,…
$ `LANSIA\r\nDOSIS 3`                          <dbl> 614259, 1442, 2367, 1378,…
$ `LANSIA TOTAL \r\nVAKSIN DIBERIKAN`          <dbl> 1615382, 3804, 6385, 3468…
$ `PELAYAN PUBLIK\r\nDOSIS 1`                  <dbl> 1483896, 3982, 3920, 4612…
$ `PELAYAN PUBLIK\r\nDOSIS 2`                  <dbl> 1379577, 3645, 3534, 4192…
$ `PELAYAN PUBLIK\r\nDOSIS 3`                  <dbl> 395504, 1185, 1185, 1033,…
$ `PELAYAN PUBLIK TOTAL\r\nVAKSIN DIBERIKAN`   <dbl> 3258977, 8812, 8639, 9837…
$ `GOTONG ROYONG\r\nDOSIS 1`                   <dbl> 88234, 179, 178, 262, 102…
$ `GOTONG ROYONG\r\nDOSIS 2`                   <dbl> 86232, 173, 179, 260, 99,…
$ `GOTONG ROYONG\r\nDOSIS 3`                   <dbl> 43402, 100, 111, 132, 53,…
$ `GOTONG ROYONG TOTAL\r\nVAKSIN DIBERIKAN`    <dbl> 217868, 452, 468, 654, 25…
$ `TENAGA KESEHATAN\r\nDOSIS 1`                <dbl> 115658, 140, 135, 348, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 2`                <dbl> 112327, 130, 131, 333, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 3`                <dbl> 91061, 110, 108, 262, 93,…
$ `TENAGA KESEHATAN TOTAL\r\nVAKSIN DIBERIKAN` <dbl> 319046, 380, 374, 943, 33…
$ `TAHAPAN 3\r\nDOSIS 1`                       <dbl> 4287820, 11318, 14850, 13…
$ `TAHAPAN 3\r\nDOSIS 2`                       <dbl> 3763773, 9632, 12577, 116…
$ `TAHAPAN 3\r\nDOSIS 3`                       <dbl> 1975879, 4777, 6455, 4893…
$ `TAHAPAN 3 TOTAL\r\nVAKSIN DIBERIKAN`        <dbl> 10027472, 25727, 33882, 3…
$ `REMAJA\r\nDOSIS 1`                          <dbl> 867652, 2308, 2732, 2858,…
$ `REMAJA\r\nDOSIS 2`                          <dbl> 787596, 2055, 2394, 2562,…
$ `REMAJA\r\nDOSIS 3`                          <dbl> 30743, 68, 89, 81, 26, 80…
$ `REMAJA TOTAL\r\nVAKSIN DIBERIKAN`           <dbl> 1685991, 4431, 5215, 5501…
Show the code!
jun2022 <- read_xlsx("data/aspatial/Data Vaksinasi Berbasis Kelurahan (30 Juni 2022).xlsx")
glimpse(jun2022)
Rows: 268
Columns: 34
$ `KODE KELURAHAN`                             <chr> NA, "3172051003", "317304…
$ `WILAYAH KOTA`                               <chr> NA, "JAKARTA UTARA", "JAK…
$ KECAMATAN                                    <chr> NA, "PADEMANGAN", "TAMBOR…
$ KELURAHAN                                    <chr> "TOTAL", "ANCOL", "ANGKE"…
$ SASARAN                                      <dbl> 8941211, 23947, 29381, 29…
$ `BELUM VAKSIN`                               <dbl> 1431393, 4402, 5041, 5632…
$ `JUMLAH\r\nDOSIS 1`                          <dbl> 7509818, 19545, 24340, 23…
$ `JUMLAH\r\nDOSIS 2`                          <dbl> 6756584, 17106, 21213, 20…
$ `JUMLAH\r\nDOSIS 3`                          <dbl> 3031594, 7369, 10086, 739…
$ `TOTAL VAKSIN\r\nDIBERIKAN`                  <dbl> 17297996, 44020, 55639, 5…
$ `LANSIA\r\nDOSIS 1`                          <dbl> 653401, 1582, 2483, 1466,…
$ `LANSIA\r\nDOSIS 2`                          <dbl> 615341, 1447, 2368, 1382,…
$ `LANSIA\r\nDOSIS 3`                          <dbl> 615341, 1447, 2368, 1382,…
$ `LANSIA TOTAL \r\nVAKSIN DIBERIKAN`          <dbl> 1630553, 3848, 6464, 3495…
$ `PELAYAN PUBLIK\r\nDOSIS 1`                  <dbl> 1484892, 3982, 3924, 4613…
$ `PELAYAN PUBLIK\r\nDOSIS 2`                  <dbl> 1380501, 3646, 3536, 4195…
$ `PELAYAN PUBLIK\r\nDOSIS 3`                  <dbl> 420795, 1244, 1265, 1104,…
$ `PELAYAN PUBLIK TOTAL\r\nVAKSIN DIBERIKAN`   <dbl> 3286188, 8872, 8725, 9912…
$ `GOTONG ROYONG\r\nDOSIS 1`                   <dbl> 88277, 180, 178, 262, 102…
$ `GOTONG ROYONG\r\nDOSIS 2`                   <dbl> 86277, 174, 179, 260, 99,…
$ `GOTONG ROYONG\r\nDOSIS 3`                   <dbl> 45143, 104, 115, 135, 56,…
$ `GOTONG ROYONG TOTAL\r\nVAKSIN DIBERIKAN`    <dbl> 219697, 458, 472, 657, 25…
$ `TENAGA KESEHATAN\r\nDOSIS 1`                <dbl> 115697, 140, 135, 348, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 2`                <dbl> 112383, 130, 131, 333, 12…
$ `TENAGA KESEHATAN\r\nDOSIS 3`                <dbl> 91999, 113, 108, 266, 95,…
$ `TENAGA KESEHATAN TOTAL\r\nVAKSIN DIBERIKAN` <dbl> 320079, 383, 374, 947, 33…
$ `TAHAPAN 3\r\nDOSIS 1`                       <dbl> 4298906, 11352, 14884, 13…
$ `TAHAPAN 3\r\nDOSIS 2`                       <dbl> 3773713, 9652, 12601, 116…
$ `TAHAPAN 3\r\nDOSIS 3`                       <dbl> 2075349, 5009, 6872, 5151…
$ `TAHAPAN 3 TOTAL\r\nVAKSIN DIBERIKAN`        <dbl> 10147968, 26013, 34357, 3…
$ `REMAJA\r\nDOSIS 1`                          <dbl> 868645, 2309, 2736, 2862,…
$ `REMAJA\r\nDOSIS 2`                          <dbl> 788369, 2057, 2398, 2564,…
$ `REMAJA\r\nDOSIS 3`                          <dbl> 36497, 80, 113, 95, 29, 1…
$ `REMAJA TOTAL\r\nVAKSIN DIBERIKAN`           <dbl> 1693511, 4446, 5247, 5521…

4.3.2 Creating an Aspatial Data Pre-processing Function

Firstly, here are some requirements for our aspatial data:

Columns of interest:

  • KODE KELURAHAN: sub-district code
  • KELURAHAN: sub-district
  • SASARAN: target
  • BELUM VAKSIN: not yet vaccinated
  • TOTAL VAKSIN DIBERIKAN: total vaccine administered

We need to create an extra Date column that has the month and year of the observation. Note that the files have a naming convention “Data Vaksinasi Berbasis Kelurahan (DD Month YYYY).xlsx”

Show the code!
# takes in an aspatial data filepath and returns a processed output
aspatial_preprocess <- function(filepath){
  # we use [-1,] to remove the first row of the file as the first row is a subheader row
  result_file <- read_xlsx(filepath)[-1,]
  
  # Create the Date Column
  # the format of our files is: Data Vaksinasi Berbasis Kelurahan (DD Month YYYY)
  # while the start is technically "(", "(" is part of a regular expression and leads to a warning message, so we'll use "Kelurahan" instead. The [[1]] refers to the first element in the list.
  # we're loading it as DD-Month-YYYY format
  # to get the end index, we use the length of the filepath - 6 
  # as such, the most relevant functions are substr (returns a substring) and either str_locate (returns location of substring as an integer matrix) or gregexpr (returns a list of locations of substring)
  # reference https://stackoverflow.com/questions/14249562/find-the-location-of-a-character-in-string
  startpoint <- gregexpr(pattern="Kelurahan", filepath)[[1]] + 11
  
  result_file$Date <- substr(filepath, startpoint, nchar(filepath)-6)
  
  # Retain the Relevant Columns
  result_file <- result_file %>% 
    select("Date", 
           "KODE KELURAHAN", 
           "KELURAHAN", 
           "SASARAN", 
           "BELUM VAKSIN", 
           "TOTAL VAKSIN\r\nDIBERIKAN")
  return(result_file)
}

4.3.3 Importing the Aspatial Data

Feeding Files into the aspatial_preprocess function using list.files() and lapply() to apply a function to all elements in the list:

Show the code!
# in the folder 'data/aspatial', find files with the extension '.xlsx' and add it to our fileslist 
# the full.names=TRUE prepends the directory path to the file names, giving a relative file path - otherwise, only the file names (not the paths) would be returned 
# reference: https://stat.ethz.ch/R-manual/R-devel/library/base/html/list.files.html
fileslist <-list.files(path = "data/aspatial", pattern = "*.xlsx", full.names=TRUE)

# afterwards, for every element in fileslist, apply aspatial_process function
dflist <- lapply(seq_along(fileslist), function(x) aspatial_preprocess(fileslist[x]))

Converting the dflist into an actual dataframe using ldply():

Show the code!
vacc_jakarta <- ldply(dflist, data.frame)

Checking vacc_jakarta:

Show the code!
glimpse(vacc_jakarta)
Rows: 3,204
Columns: 6
$ Date                    <chr> "27 Februari 2022", "27 Februari 2022", "27 Fe…
$ KODE.KELURAHAN          <chr> "3172051003", "3173041007", "3175041005", "317…
$ KELURAHAN               <chr> "ANCOL", "ANGKE", "BALE KAMBANG", "BALI MESTER…
$ SASARAN                 <dbl> 23947, 29381, 29074, 9752, 26285, 21566, 23886…
$ BELUM.VAKSIN            <dbl> 4592, 5319, 5903, 1649, 4030, 3950, 3344, 9382…
$ TOTAL.VAKSIN..DIBERIKAN <dbl> 36042, 44800, 42925, 15348, 42415, 33278, 3929…

4.3.4 Formatting Date Column

The Dates are currently in string format as there were derived from the file names, hence we need to convert the Dates into datetime format.

Show the code!
# parses the 'Date' column into Month(Full Name)-YYYY datetime objects
# reference: https://stackoverflow.com/questions/53380650/b-y-date-conversion-gives-na

# locale="ind" means that the locale has been set as Indonesia
Sys.setlocale(locale="ind")
[1] "LC_COLLATE=Indonesian_Indonesia.1252;LC_CTYPE=Indonesian_Indonesia.1252;LC_MONETARY=Indonesian_Indonesia.1252;LC_NUMERIC=C;LC_TIME=Indonesian_Indonesia.1252"

Converting to datetime format:

Show the code!
vacc_jakarta$Date <- c(vacc_jakarta$Date) %>% 
  as.Date(vacc_jakarta$Date, format ="%d %B %Y")

glimpse(vacc_jakarta)
Rows: 3,204
Columns: 6
$ Date                    <date> 2022-02-27, 2022-02-27, 2022-02-27, 2022-02-2~
$ KODE.KELURAHAN          <chr> "3172051003", "3173041007", "3175041005", "317~
$ KELURAHAN               <chr> "ANCOL", "ANGKE", "BALE KAMBANG", "BALI MESTER~
$ SASARAN                 <dbl> 23947, 29381, 29074, 9752, 26285, 21566, 23886~
$ BELUM.VAKSIN            <dbl> 4592, 5319, 5903, 1649, 4030, 3950, 3344, 9382~
$ TOTAL.VAKSIN..DIBERIKAN <dbl> 36042, 44800, 42925, 15348, 42415, 33278, 3929~

4.3.4 Renaming Columns to English

Renaming columns to English for ease of comprehension:

Show the code!
# renames the columns in the style New_Name = OLD_NAME
vacc_jakarta <- vacc_jakarta %>% 
  dplyr::rename(
    Date=Date,
    Sub_District_Code=KODE.KELURAHAN,
    Sub_District=KELURAHAN, 
    Target=SASARAN, 
    Not_Yet_Vaccinated=BELUM.VAKSIN, 
    Total_Vaccine_Administered=TOTAL.VAKSIN..DIBERIKAN
    )

4.3.5 Further Data Processing

After finalising the dataframe, we can proceed with other data processing requirements.

Checking for missing values:

Show the code!
# returns rows that contain NA values
vacc_jakarta[rowSums(is.na(vacc_jakarta))!=0,]
[1] Date                       Sub_District_Code         
[3] Sub_District               Target                    
[5] Not_Yet_Vaccinated         Total_Vaccine_Administered
<0 rows> (or 0-length row.names)

From the output, there are no missing values.

4.3 Geospatial Data Integration

4.3.1 Preliminary joining + EDA

We need to join the geospatial and aspatial data frames but we first need to see what they both commonly have.

Check column names of bd_jakarta:

Show the code!
colnames(bd_jakarta)
 [1] "Object_ID"        "Village_Code"     "Village"          "Code"            
 [5] "Province"         "City"             "District"         "Sub_District"    
 [9] "Total_Population" "geometry"        

Check column names of vacc_jakarta:

Show the code!
colnames(vacc_jakarta)
[1] "Date"                       "Sub_District_Code"         
[3] "Sub_District"               "Target"                    
[5] "Not_Yet_Vaccinated"         "Total_Vaccine_Administered"

We are able to see that we can join the dataframes with Sub_District and Sub_District_Code:

Show the code!
combined_jakarta <- left_join(bd_jakarta, vacc_jakarta,
                              by=c(
                                "Sub_District"="Sub_District", 
                             "Village_Code"="Sub_District_Code")
                              )

Visualising combined_jakarta in terms of vaccine administered and total population:

Show the code!
vaccine_administered = tm_shape(combined_jakarta)+
  tm_fill("Total_Vaccine_Administered") +
  tm_borders(alpha = 0.5) +
  tm_layout(main.title="Vaccine Administered Count")

total_population = tm_shape(combined_jakarta)+
  tm_fill("Total_Population") +
  tm_borders(alpha = 0.5) +
  tm_layout(main.title="Total Count")

tmap_arrange(vaccine_administered, total_population)

There are some missing values even though there are no rows with missing values. This could be due to the mismatch in the values due to slightly different namings for the same sub-district when the left join was done.

4.3.2 Identifying Mismatched Sub-District Records

Checking for unique values of Sub-District in vacc_jakarta but not in bd_jakarta and vice versa:

Show the code!
vacc_subdistrict <- c(vacc_jakarta$Sub_District)
bd_subdistrict <- c(bd_jakarta$Sub_District)

unique(vacc_subdistrict[!(vacc_subdistrict %in% bd_subdistrict)])
 [1] "BALE KAMBANG"          "HALIM PERDANA KUSUMAH" "JATI PULO"            
 [4] "KAMPUNG TENGAH"        "KERENDANG"             "KRAMAT JATI"          
 [7] "PAL MERIAM"            "PINANG RANTI"          "PULAU HARAPAN"        
[10] "PULAU KELAPA"          "PULAU PANGGANG"        "PULAU PARI"           
[13] "PULAU TIDUNG"          "PULAU UNTUNG JAWA"     "RAWA JATI"            
Show the code!
unique(bd_subdistrict[!(bd_subdistrict %in% vacc_subdistrict)])
[1] "KRENDANG"             "RAWAJATI"             "TENGAH"              
[4] "BALEKAMBANG"          "PINANGRANTI"          "JATIPULO"            
[7] "PALMERIAM"            "KRAMATJATI"           "HALIM PERDANA KUSUMA"

Table to view difference in naming:

Show the code!
# initialise a dataframe of our cases vs bd subdistrict spelling
spelling <- data.frame(
  Aspatial_Cases=c("BALE KAMBANG", "HALIM PERDANA KUSUMAH", "JATI PULO", "KAMPUNG TENGAH", "KERENDANG", "KRAMAT JATI", "PAL MERIAM", "PINANG RANTI", "RAWA JATI"),
  Geospatial_BD=c("BALEKAMBAG", "HALIM PERDANA KUSUMA", "JATIPULO", "TENGAH", "KRENDANG", "KRAMATJATI", "PALMERIAM", "PINANGRANTI", "RAWAJATI")
  )

# with dataframe a input, outputs a kable
library(knitr)
library(kableExtra)
kable(spelling, caption="Mismatched Records") %>%
  kable_material("hover", latex_options="scale_down")
Mismatched Records
Aspatial_Cases Geospatial_BD
BALE KAMBANG BALEKAMBAG
HALIM PERDANA KUSUMAH HALIM PERDANA KUSUMA
JATI PULO JATIPULO
KAMPUNG TENGAH TENGAH
KERENDANG KRENDANG
KRAMAT JATI KRAMATJATI
PAL MERIAM PALMERIAM
PINANG RANTI PINANGRANTI
RAWA JATI RAWAJATI

Correcting the mismatched sub-district records in bd_jakarta:

Show the code!
# where bd_jakarta is a mismatched value, replace with the correct value
bd_jakarta$Sub_District[bd_jakarta$Sub_District == 'BALEKAMBANG'] <- 'BALE KAMBANG'
bd_jakarta$Sub_District[bd_jakarta$Sub_District == 'HALIM PERDANA KUSUMA'] <- 'HALIM PERDANA KUSUMAH'
bd_jakarta$Sub_District[bd_jakarta$Sub_District == 'JATIPULO'] <- 'JATI PULO'
bd_jakarta$Sub_District[bd_jakarta$Sub_District == 'KALI BARU'] <- 'KALIBARU'
bd_jakarta$Sub_District[bd_jakarta$Sub_District == 'TENGAH'] <- 'KAMPUNG TENGAH'
bd_jakarta$Sub_District[bd_jakarta$Sub_District == 'KRAMATJATI'] <- 'KRAMAT JATI'
bd_jakarta$Sub_District[bd_jakarta$Sub_District == 'KRENDANG'] <- 'KERENDANG'
bd_jakarta$Sub_District[bd_jakarta$Sub_District == 'PALMERIAM'] <- 'PAL MERIAM'
bd_jakarta$Sub_District[bd_jakarta$Sub_District == 'PINANGRANTI'] <- 'PINANG RANTI'
bd_jakarta$Sub_District[bd_jakarta$Sub_District == 'RAWAJATI'] <- 'RAWA JATI'

There are 6 more unique values in vacc_jakarta as those values are data referring to the outer islands looking at the fact that WILAYAH KOTA is not in JAKARTA:

Thus, we need to remove the rows with these outer islands data:

Show the code!
vacc_jakarta <- vacc_jakarta[!(vacc_jakarta$Sub_District=="PULAU HARAPAN" | vacc_jakarta$Sub_District=="PULAU KELAPA" | vacc_jakarta$Sub_District=="PULAU PANGGANG" | vacc_jakarta$Sub_District=="PULAU PARI" | vacc_jakarta$Sub_District=="PULAU TIDUNG" | vacc_jakarta$Sub_District=="PULAU UNTUNG JAWA"), ]

Re-checking for rows with NA values in vacc_jakarta:

Show the code!
vacc_jakarta[rowSums(is.na(vacc_jakarta))!=0,]
[1] Date                       Sub_District_Code         
[3] Sub_District               Target                    
[5] Not_Yet_Vaccinated         Total_Vaccine_Administered
<0 rows> (or 0-length row.names)

Re-checking for rows with NA values in bd_jakarta:

Show the code!
bd_jakarta[rowSums(is.na(bd_jakarta))!=0,]
Simple feature collection with 0 features and 9 fields
Bounding box:  xmin: NA ymin: NA xmax: NA ymax: NA
Projected CRS: DGN95 / Indonesia TM-3 zone 54.1
 [1] Object_ID        Village_Code     Village          Code            
 [5] Province         City             District         Sub_District    
 [9] Total_Population geometry        
<0 rows> (or 0-length row.names)

4.3.3 Re-joining the geospatial and aspatial data frames + EDA

Show the code!
# joins vacc_jakarta to bd_jakarta based on Sub_District
combined_jakarta <- left_join(bd_jakarta, vacc_jakarta,
                              by=c("Sub_District"="Sub_District")
                              )

Checking for rows with NA values in combined_jakarta:

Show the code!
combined_jakarta[rowSums(is.na(combined_jakarta))!=0,]
Simple feature collection with 0 features and 14 fields
Bounding box:  xmin: NA ymin: NA xmax: NA ymax: NA
Projected CRS: DGN95 / Indonesia TM-3 zone 54.1
 [1] Object_ID                  Village_Code              
 [3] Village                    Code                      
 [5] Province                   City                      
 [7] District                   Sub_District              
 [9] Total_Population           Date                      
[11] Sub_District_Code          Target                    
[13] Not_Yet_Vaccinated         Total_Vaccine_Administered
[15] geometry                  
<0 rows> (or 0-length row.names)

Visualising combined_jakarta in terms of vaccine administered and total population again:

Show the code!
vaccine_administered = tm_shape(combined_jakarta)+
  tm_fill("Total_Vaccine_Administered") +
  tm_borders(alpha = 0.5) +
  tm_layout(main.title="Updated Vaccine Administered Count")

total_population = tm_shape(combined_jakarta)+
  tm_fill("Total_Population") +
  tm_borders(alpha = 0.5) +
  tm_layout(main.title="Updated Total Count")

tmap_arrange(vaccine_administered, total_population)

4.4 Calculation for Vaccination Rate

We need to compute the monthly vaccination rate: vaccination rate (in %) = (total population - number of people not vaccinated yet) / total population * 100

Show the code!
# grouping based on the sub-district and date
# the cumulative_case_rate is based on the sum of cases over the total population
vacc_rate <- vacc_jakarta %>%
  inner_join(bd_jakarta, by=c("Sub_District" = "Sub_District")) %>%
  group_by(Sub_District, Date) %>%
  dplyr::summarise(`vacc_rate` = ((Total_Population-Not_Yet_Vaccinated)/Total_Population)*100) %>%
  
  #afterwards, pivots the table based on the Dates, using the cumulative case rate as the values
  ungroup() %>% pivot_wider(names_from = Date,
              values_from = vacc_rate)

Show Vaccination Rate:

Show the code!
vacc_rate
# A tibble: 261 x 13
   Sub_District  2021-~1 2021-~2 2021-~3 2021-~4 2021-~5 2021-~6 2022-~7 2022-~8
   <chr>           <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
 1 ANCOL            58.7    69.2    77.6    80.0    81.5    83.1    84.5    84.6
 2 ANGKE            61.9    71.5    79.2    82.0    83.6    84.6    85.2    85.4
 3 BALE KAMBANG     48.2    64.6    75.4    78.6    80.8    82.1    83.1    83.3
 4 BALI MESTER      55.8    68.3    78.5    81.8    83.6    84.8    85.7    85.9
 5 BAMBU APUS       56.6    70.4    80.3    84.2    85.5    86.2    87.2    87.3
 6 BANGKA           60.2    68.2    78.0    81.9    83.5    84.1    84.8    85.0
 7 BARU             65.8    73.6    83.3    86.1    87.2    87.8    88.4    88.6
 8 BATU AMPAR       51.0    66.2    76.0    79.3    81.3    82.7    83.8    84.1
 9 BENDUNGAN HI~    63.2    70.4    80.7    83.5    84.6    85.3    86.0    86.1
10 BIDARA CINA      51.8    65.6    76.5    79.8    81.3    82.3    83.1    83.3
# ... with 251 more rows, 4 more variables: `2022-03-31` <dbl>,
#   `2022-04-30` <dbl>, `2022-05-31` <dbl>, `2022-06-30` <dbl>, and abbreviated
#   variable names 1: `2021-07-31`, 2: `2021-08-31`, 3: `2021-09-30`,
#   4: `2021-10-31`, 5: `2021-11-30`, 6: `2021-12-31`, 7: `2022-01-31`,
#   8: `2022-02-27`

4.4.1 Converting dataframes to sf objects

Before moving on to mapping, we should convert dataframes into sf objects

Converting combined_jakarta and vacc_rate:

Show the code!
combined_jakarta <- st_as_sf(combined_jakarta)

# need to join our previous dataframes with the geospatial data to ensure that geometry column is present
vacc_rate <- vacc_rate%>% left_join(bd_jakarta, by=c("Sub_District"="Sub_District"))
vacc_rate <- st_as_sf(vacc_rate)

4.5 Choropleth Mapping and Analysis

There are different data classifications to choropleth maps like equal intervals, quantile, jenks and standard deviation. I have decided to use Jenks as it minimises variation in each class. It will be able to find suitable class ranges and also group outliers in a class of its own.

4.5.1 Jenks Choropleth Map

As we do not want too many classes, we will use 6 classes as it seems to be the optimum number to view different classes and we will be able to differentiate between the classes without straining our eyes.

Map for Jul 2021:

Show the code!
# using the jenks method, with 6 classes
tmap_mode("plot")
tm_shape(vacc_rate)+
  tm_fill("2021-07-31", 
          n= 6,
          style = "jenks", 
          title = "Vaccination Rate") +
  tm_layout(main.title = "Distribution of Vaccination Rate in July 2021",
            main.title.position = "center",
            main.title.size = 1,
            legend.height = 0.5, 
            legend.width = 0.4,
            frame = TRUE) +
  tm_borders(alpha = 0.5)

Introducing a helper function to help us plot the maps for all 12 months:

Show the code!
# input: the dataframe and the variable name - in this case, the month 
# with style="jenks" for the jenks classification method
jenks_plot <- function(df, varname) {
  tm_shape(vacc_rate) +
    tm_polygons() +
  tm_shape(df) +
    tm_fill(varname, 
          n= 6,
          style = "jenks", 
          title = "Vaccination Rate") +
    tm_layout(main.title = varname,
          main.title.position = "center",
          main.title.size = 1.2,
          legend.height = 0.45, 
          legend.width = 0.35,
          frame = TRUE) +
    tm_borders(alpha = 0.5)
}

Visualising the Jenks Maps for all 12 months:

Show the code!
tmap_mode("plot")
tmap_arrange(jenks_plot(vacc_rate, "2021-07-31"),
             jenks_plot(vacc_rate, "2021-08-31"),
             jenks_plot(vacc_rate, "2021-09-30"),
             jenks_plot(vacc_rate, "2021-10-31"))

Show the code!
tmap_mode("plot")
tmap_arrange(jenks_plot(vacc_rate, "2021-11-30"),
             jenks_plot(vacc_rate, "2021-12-31"),
             jenks_plot(vacc_rate, "2022-01-31"),
             jenks_plot(vacc_rate, "2022-02-27"))

Show the code!
tmap_mode("plot")
tmap_arrange(jenks_plot(vacc_rate, "2022-03-31"),
             jenks_plot(vacc_rate, "2022-04-30"),
             jenks_plot(vacc_rate, "2022-05-31"),
             jenks_plot(vacc_rate, "2022-06-30"))

4.5.2 Observations from Jenks Choropleth Maps

For each map, they have their own relative vaccination rate as the range for each map differs. Hence, we cannot rely on the colour scale for each map to compare between the months as it would not be fair.

However, we are able to compare each month individually and see that typically for each month, the higher vaccination rates are at the central area and southern area.

Some other analysis can be done like the sub-district with the highest vaccination rate and the sub-district with the lowest vaccination rate for each month:

Show the code!
#highest vaccination rate for each month
vacc_rate$Sub_District[which.max(vacc_rate$`2021-07-31`)]
[1] "HALIM PERDANA KUSUMAH"
Show the code!
vacc_rate$Sub_District[which.max(vacc_rate$`2021-08-31`)]
[1] "KAMPUNG RAWA"
Show the code!
vacc_rate$Sub_District[which.max(vacc_rate$`2021-09-30`)]
[1] "HALIM PERDANA KUSUMAH"
Show the code!
vacc_rate$Sub_District[which.max(vacc_rate$`2021-10-31`)]
[1] "HALIM PERDANA KUSUMAH"
Show the code!
vacc_rate$Sub_District[which.max(vacc_rate$`2021-11-30`)]
[1] "HALIM PERDANA KUSUMAH"
Show the code!
vacc_rate$Sub_District[which.max(vacc_rate$`2021-12-31`)]
[1] "HALIM PERDANA KUSUMAH"
Show the code!
vacc_rate$Sub_District[which.max(vacc_rate$`2022-01-31`)]
[1] "HALIM PERDANA KUSUMAH"
Show the code!
vacc_rate$Sub_District[which.max(vacc_rate$`2022-02-27`)]
[1] "HALIM PERDANA KUSUMAH"
Show the code!
vacc_rate$Sub_District[which.max(vacc_rate$`2022-03-31`)]
[1] "HALIM PERDANA KUSUMAH"
Show the code!
vacc_rate$Sub_District[which.max(vacc_rate$`2022-04-30`)]
[1] "HALIM PERDANA KUSUMAH"
Show the code!
vacc_rate$Sub_District[which.max(vacc_rate$`2022-05-31`)]
[1] "HALIM PERDANA KUSUMAH"
Show the code!
vacc_rate$Sub_District[which.max(vacc_rate$`2022-06-30`)]
[1] "HALIM PERDANA KUSUMAH"

From this, we can tell that the sub-district “HALIM PERDANA KUSMAH” consistently has the highest vaccination rate except for 1 month in Aug 2021.

Show the code!
#lowest vaccination rate for each month
vacc_rate$Sub_District[which.min(vacc_rate$`2021-07-31`)]
[1] "BALE KAMBANG"
Show the code!
vacc_rate$Sub_District[which.min(vacc_rate$`2021-08-31`)]
[1] "BALE KAMBANG"
Show the code!
vacc_rate$Sub_District[which.min(vacc_rate$`2021-09-30`)]
[1] "KALIBARU"
Show the code!
vacc_rate$Sub_District[which.min(vacc_rate$`2021-10-31`)]
[1] "KALIBARU"
Show the code!
vacc_rate$Sub_District[which.min(vacc_rate$`2021-11-30`)]
[1] "KALIBARU"
Show the code!
vacc_rate$Sub_District[which.min(vacc_rate$`2021-12-31`)]
[1] "KEBON MELATI"
Show the code!
vacc_rate$Sub_District[which.min(vacc_rate$`2022-01-31`)]
[1] "KALIBARU"
Show the code!
vacc_rate$Sub_District[which.min(vacc_rate$`2022-02-27`)]
[1] "KEBON MELATI"
Show the code!
vacc_rate$Sub_District[which.min(vacc_rate$`2022-03-31`)]
[1] "KEBON MELATI"
Show the code!
vacc_rate$Sub_District[which.min(vacc_rate$`2022-04-30`)]
[1] "KEBON MELATI"
Show the code!
vacc_rate$Sub_District[which.min(vacc_rate$`2022-05-31`)]
[1] "KEBON MELATI"
Show the code!
vacc_rate$Sub_District[which.min(vacc_rate$`2022-06-30`)]
[1] "KEBON MELATI"

From this, we can tell that initially the sub-district “BALE KAMBANG” had the lowest vaccination rate from July 2021 to August 2021, but their vaccination rate improved over the months such that “KALIBARU” was identified as the sub-district with the lowest vaccination rate from September 2021 to January 2022 with the exception of December 2021. Then, “KEBON MELATI” became the sub-district with the lowest vaccination rate from December 2021 to June 2022 with the exception of January 2022.

4.5.3 Spatio-Temporal Mapping with custom breakpoints

In the above section, each month had their own vaccination rate. To compare with the vaccination rate between months and see the spatio-temporal progression of the vaccination rates, we should set a fixed range.

To do so, we have to customise the breakpoints and following the above section, we will define 6 breakpoints.

First, we require the maximum vaccination rate which would be from the latest month (June 2022):

Show the code!
max(vacc_rate$`2022-06-30`)
[1] 91.86885

Now, we can define the 6 breakpoints based on the jenks breaks ranges from the above section:

Show the code!
breakpoints = c(48, 65, 72, 82, 86, 92)

Creating a helper function for break plot:

break_plot <- function(df, varname) {
  tm_shape(vacc_rate) +
    tm_polygons() +
  tm_shape(df) +
    tm_fill(varname, 
          breaks= breakpoints,
          title = "Vaccination Rate") +
    tm_layout(main.title = varname,
          main.title.position = "center",
          main.title.size = 1.2,
          legend.height = 0.45, 
          legend.width = 0.35,
          frame = TRUE) +
    tm_borders(alpha = 0.5)
}

Plotting the custom break plots for each month:

Show the code!
tmap_mode("plot")
tmap_arrange(break_plot(vacc_rate, "2021-07-31"),
             break_plot(vacc_rate, "2021-08-31"),
             break_plot(vacc_rate, "2021-09-30"),
             break_plot(vacc_rate, "2021-10-31"))

Show the code!
tmap_mode("plot")
tmap_arrange(break_plot(vacc_rate, "2021-11-30"),
             break_plot(vacc_rate, "2021-12-31"),
             break_plot(vacc_rate, "2022-01-31"),
             break_plot(vacc_rate, "2022-02-27"))

Show the code!
tmap_mode("plot")
tmap_arrange(break_plot(vacc_rate, "2022-03-31"),
             break_plot(vacc_rate, "2022-04-30"),
             break_plot(vacc_rate, "2022-05-31"),
             break_plot(vacc_rate, "2022-06-30"))

4.5.4 Observations from Custom Breakplot Maps

At the start, in July 2021 and August 2021, there is a slightly higher vaccination rate at the Northern area compared to the other areas given its slightly darker shade of yellow.

However as time passes, from September 2021 to October 2021, the increase in the vaccination rate becomes more evenly spread and there is not much obvious difference other than a few sub-districts here and there.

Specifically sub-district “HALIM PERDANA KUSUMAH” is obvious to the eye with its consistently high rate and darker shade.

From November 2021 to February 2022, the increase in vaccination rate is faster at the Southern area and the Northern Central Area then sub-districts at the Northern border start to catch up.

(Supplementing the previous observations in section 4.5.2, the general increasing trend happens at the Southern and Central area.)

From March 2022 to June 2022, we can see the sub-districts at the Northern border as well as some sub-districts in the central area increasing their vaccination rates.

4.6 Local Gi* Analysis

4.6.1 Computing local Gi* values of the monthly vaccination rate

wm_q <- combined_jakarta %>%
  mutate(nb = st_contiguity(geometry),
         wt = st_weights(nb, style='W'),
         .before=1)
set.seed(1234)
HCSA <- wm_q %>%
  mutate(local_Gi = local_gstar_perm(
    ((Total_Population-Not_Yet_Vaccinated)/Total_Population*100), nb, wt, nsim=99),
    .before=1) %>%
  unnest(local_Gi)
HCSA
Simple feature collection with 3132 features and 24 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -3644275 ymin: 663887.8 xmax: -3606237 ymax: 701380.1
Projected CRS: DGN95 / Indonesia TM-3 zone 54.1
# A tibble: 3,132 x 25
   gi_star     e_gi   var_gi p_value p_sim p_folde~1 skewn~2 kurto~3 nb    wt   
     <dbl>    <dbl>    <dbl>   <dbl> <dbl>     <dbl>   <dbl>   <dbl> <nb>  <lis>
 1    1.64 0.000320 1.32e-11  0.100   0.04      0.02 -0.487  -0.400  <int> <dbl>
 2    1.61 0.000319 1.48e-11  0.108   0.14      0.07 -0.157  -0.307  <int> <dbl>
 3    1.64 0.000319 1.64e-11  0.101   0.06      0.03 -0.559   0.550  <int> <dbl>
 4    1.71 0.000319 1.49e-11  0.0870  0.06      0.03 -0.359  -0.530  <int> <dbl>
 5    1.82 0.000319 1.10e-11  0.0681  0.1       0.05 -0.0267 -0.351  <int> <dbl>
 6    1.72 0.000319 1.39e-11  0.0854  0.08      0.04 -0.264   0.0711 <int> <dbl>
 7    1.68 0.000319 1.64e-11  0.0928  0.1       0.05 -0.273  -0.433  <int> <dbl>
 8    1.53 0.000319 1.56e-11  0.127   0.14      0.07 -0.300   0.112  <int> <dbl>
 9    1.52 0.000319 1.58e-11  0.129   0.16      0.08  0.0236 -0.195  <int> <dbl>
10    1.65 0.000319 1.45e-11  0.0990  0.1       0.05 -0.0688 -0.652  <int> <dbl>
# ... with 3,122 more rows, 15 more variables: Object_ID <dbl>,
#   Village_Code <chr>, Village <chr>, Code <dbl>, Province <chr>, City <chr>,
#   District <chr>, Sub_District <chr>, Total_Population <dbl>, Date <date>,
#   Sub_District_Code <chr>, Target <dbl>, Not_Yet_Vaccinated <dbl>,
#   Total_Vaccine_Administered <dbl>, geometry <MULTIPOLYGON [m]>, and
#   abbreviated variable names 1: p_folded_sim, 2: skewness, 3: kurtosis

4.6.2 Displaying the Gi* maps of the monthly vaccination rate

Visualising Gi*:

tmap_mode("view")
tm_shape(HCSA) +
  tm_fill("gi_star") +
  tm_borders(alpha=0.5) + 
  tm_view(set.zoom.limits = c(10,16))

Visualising p-value of HCSA:

tmap_mode("plot")
tm_shape(HCSA) +
  tm_fill("p_sim") +
  tm_borders(alpha=0.5) + 
  tm_view(set.zoom.limits = c(10,16))

4.6.3 Statistical conclusions

4.7 Emerging Hot Spot Analysis (EHSA)

Making an attribute table:

# make new vaccination attribute table with Date, Sub_District, Total_Population, Not_Yet_Vaccinated
vacc_attribute_table <- combined_jakarta %>% select(10, 8, 9, 13) %>% st_drop_geometry()

# add a new field for Vaccination_Rate
vacc_attribute_table$Vaccination_Rate <- (vacc_attribute_table$Total_Population - vacc_attribute_table$Not_Yet_Vaccinated) / vacc_attribute_table$Total_Population*100

# final vaccination attribute table with Date, Sub_District, Vaccination_Rate
vacc_attribute_table <- tibble(vacc_attribute_table %>% select(1,2,5))

Display attribute table details:

vacc_attribute_table
# A tibble: 3,132 x 3
   Date       Sub_District Vaccination_Rate
   <date>     <chr>                   <dbl>
 1 2022-02-27 KEAGUNGAN                87.3
 2 2022-04-30 KEAGUNGAN                88.0
 3 2022-06-30 KEAGUNGAN                88.2
 4 2021-11-30 KEAGUNGAN                85.7
 5 2021-09-30 KEAGUNGAN                80.5
 6 2021-08-31 KEAGUNGAN                72.0
 7 2021-12-31 KEAGUNGAN                86.5
 8 2022-01-31 KEAGUNGAN                87.1
 9 2021-07-31 KEAGUNGAN                62.4
10 2022-03-31 KEAGUNGAN                87.6
# ... with 3,122 more rows

Creating a time series cube:

vacc_rate_st <- spacetime(vacc_attribute_table, bd_jakarta,
                          .loc_col = "Sub_District",
                          .time_col = "Date")
vacc_rate_st
# A tibble: 3,132 x 3
   Date       Sub_District Vaccination_Rate
 * <date>     <chr>                   <dbl>
 1 2022-02-27 KEAGUNGAN                87.3
 2 2022-04-30 KEAGUNGAN                88.0
 3 2022-06-30 KEAGUNGAN                88.2
 4 2021-11-30 KEAGUNGAN                85.7
 5 2021-09-30 KEAGUNGAN                80.5
 6 2021-08-31 KEAGUNGAN                72.0
 7 2021-12-31 KEAGUNGAN                86.5
 8 2022-01-31 KEAGUNGAN                87.1
 9 2021-07-31 KEAGUNGAN                62.4
10 2022-03-31 KEAGUNGAN                87.6
# ... with 3,122 more rows
vacc_rate_nb <- vacc_rate_st %>%
  activate("geometry") %>%
  mutate(nb = include_self(st_contiguity(geometry)),
         wt = st_weights(nb)
         ) %>%
  set_nbs("nb") %>%
  set_wts("wt")

Computing Gi*:

gi_stars <- vacc_rate_nb |>
  group_by(Date) |>
  mutate(gi_star = local_gstar_perm(
    Vaccination_Rate, nb, wt, nsim=99)) |>
      tidyr::unnest(gi_star)
gi_stars
# A tibble: 3,132 x 13
# Groups:   Date [12]
   Date       Sub_Di~1 Vacci~2 nb    wt    gi_star    e_gi  var_gi p_value p_sim
   <date>     <chr>      <dbl> <lis> <lis>   <dbl>   <dbl>   <dbl>   <dbl> <dbl>
 1 2021-07-31 KEAGUNG~    62.4 <int> <dbl>  2.34   0.00383 8.82e-9 1.92e-2  0.02
 2 2021-07-31 GLODOK      66.9 <int> <dbl>  3.36   0.00382 7.56e-9 7.81e-4  0.02
 3 2021-07-31 HARAPAN~    61.0 <int> <dbl>  1.34   0.00383 9.19e-9 1.80e-1  0.22
 4 2021-07-31 CEMPAKA~    58.6 <int> <dbl>  0.0266 0.00382 8.32e-9 9.79e-1  1   
 5 2021-07-31 PASAR B~    69.0 <int> <dbl>  3.78   0.00383 6.69e-9 1.58e-4  0.02
 6 2021-07-31 KARANG ~    63.1 <int> <dbl>  2.37   0.00383 8.88e-9 1.79e-2  0.06
 7 2021-07-31 MANGGA ~    63.0 <int> <dbl>  2.19   0.00385 5.53e-9 2.83e-2  0.06
 8 2021-07-31 PETOJO ~    57.8 <int> <dbl>  0.357  0.00382 8.10e-9 7.21e-1  0.78
 9 2021-07-31 SENEN       64.1 <int> <dbl>  2.76   0.00383 4.96e-9 5.74e-3  0.02
10 2021-07-31 BUNGUR      62.8 <int> <dbl>  1.61   0.00385 7.89e-9 1.07e-1  0.08
# ... with 3,122 more rows, 3 more variables: p_folded_sim <dbl>,
#   skewness <dbl>, kurtosis <dbl>, and abbreviated variable names
#   1: Sub_District, 2: Vaccination_Rate

4.7.1 Mann-Kendall Test

chg <- gi_stars |>
  ungroup() |>
  filter(Sub_District == "HALIM PERDANA KUSUMAH") |>
  select(Sub_District, Date, gi_star)
chg
# A tibble: 12 x 3
   Sub_District          Date       gi_star
   <chr>                 <date>       <dbl>
 1 HALIM PERDANA KUSUMAH 2021-07-31    1.69
 2 HALIM PERDANA KUSUMAH 2021-08-31    2.45
 3 HALIM PERDANA KUSUMAH 2021-09-30    3.16
 4 HALIM PERDANA KUSUMAH 2021-10-31    2.97
 5 HALIM PERDANA KUSUMAH 2021-11-30    3.45
 6 HALIM PERDANA KUSUMAH 2021-12-31    3.58
 7 HALIM PERDANA KUSUMAH 2022-01-31    3.61
 8 HALIM PERDANA KUSUMAH 2022-02-27    3.27
 9 HALIM PERDANA KUSUMAH 2022-03-31    3.30
10 HALIM PERDANA KUSUMAH 2022-04-30    3.36
11 HALIM PERDANA KUSUMAH 2022-05-31    3.54
12 HALIM PERDANA KUSUMAH 2022-06-30    3.41
ggplot(data = chg,
       aes(x = Date,
           y = gi_star)) + 
  geom_line() + 
  theme_light()

4.7.2 EHSA map of the Gi* values of the vaccination rate

ehsa <- emerging_hotspot_analysis(
  x = vacc_rate_st,
  .var = "Vaccination_Rate",
  k = 1,
  nsim = 99
)
ggplot(data = ehsa,
       aes(x=classification)) + 
  geom_bar()

5 References